/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.vse.adventura.po1715.xshet00_shevtsova.gui;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IListener;

import java.util.Collection;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;




/*******************************************************************************
 * Instance třídy {@code APanelPrvků} představují panely,
 * v nichž jsou umístěny komponenty zobrazující jednotlivé vložené prvky.
 *
 * @param <T> Typ informátora, z nějž může oslovený posluchač získat informace
 *            potřebné pro zpracování obdrženého hlášení
 *
 * @author    TShevtsova
 * @version   0.00.000
 */
public abstract class APanelPrvků <T> extends Box
       implements IListener<T>
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Velikost mezery vkládané mezi jednotlivé prvky. */
    private static final int MEZERA = 10;



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Titulek oznamující obsah okna. */
    private final JLabel lblTitulek;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří základ panelu prvků nadepsaného zadaným titulkem.
     *
     * @param titulek Označení vytvářeného panelu prvků
     */
    public APanelPrvků(String titulek)
    {
        super(BoxLayout.Y_AXIS);
        lblTitulek = new JLabel(
            "<html><font color=\"red\">" + titulek +
            "</font><hr></html>");
    }



//== ABSTRAKTNÍ METODY =========================================================

    /***************************************************************************
     * Hlášeni o vzniku události, na kterou posluchač čeká.
     *
     * @param informátor Objekt, od nějž může oslovený objekt
     *                   získat potřebné informace
     */
    @Override
    public abstract void notice(T informátor);


    /***************************************************************************
     * Inicializuje panel pro práci s novou hrou.
     * Při ní se panel musí přihlásit u hry jako posluchač jistého druhu objektů
     * a zobrazit příslušné objekty na počátku hry.
     *
     * @param hra Hra, s níž bude panel od této chvíle komunikovat
     */
    abstract public void inicializuj(IGameG hra);



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Závěrečná fáze zpracování obdrženého hlášení poté,
     * co oslovený objekt připravil kolekci zobrazovaných objektů.
     * Metoda vyčistí panel a naplní jej objekty obdrženými v parametru.
     *
     * @param prvky Prvky, které je v panelu třeba zobrazit.
     *
     * Kolekce má definované prvky typu {@code <? extends JComponent>} proto,
     * aby bylo možno jednouše přejít od návěští, tj. od prvků typu
     * {@link PrvekPanelu}, které jsou potomky typu {@link JLabel},
     * k tlačítkům, tj. k prvkům typu {@link PrvekPaneluBtn},
     * které jsou potomky typu {@link javax.swing.JButton}.
     * Typ {@link JComponent} je totiž jejich nejbližším společným předkem.
     */
    public void zpracujHlášení(Collection<? extends JComponent> prvky)
    {
        this.removeAll();
        this.add(lblTitulek);
        for (JComponent prvek : prvky) {
            this.add(prvek);
            this.add(Box.createVerticalStrut(MEZERA)); //Oddělovací mezera
        }
        this.add(Box.createVerticalStrut(MEZERA));
        this.repaint();
        this.revalidate();
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        APanelPrvků inst = new APanelPrvků();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
